package com.czk.queue;

/**
 * 环形队列的实现
 * @Author:ChenZhangKun
 * @Date: 2020/6/9 21:32
 */
public class CircleQueue {
    public static void main(String[] args) {
        Queue queue=new Queue(5);
        queue.addQueue(1);
        queue.addQueue(2);
        queue.addQueue(3);
        queue.addQueue(4);
        queue.addQueue(5);
        System.out.println(queue.headQueue());
        queue.showQueue();
    }
}
class Queue{
    // 队列首指针
    private int front=0;
    // 最大容量
    private int maxSize;
    // 队尾指针 队列的最后一个元素的后一个位置
    private int rear;
    // 底层数组
    private int[] array;
    public Queue(int maxSize) {
        this.maxSize = maxSize;
        array=new int[maxSize];
    }
    // 判断队列是否满
    public boolean isFull(){
        return (rear+1)%maxSize==front;
    }
    // 判断队列是否为空
    public boolean isEmpty(){
        return rear==front;
    }
    // 添加元素
    public void addQueue(int n){
        if (isFull()){
            System.out.println("数组满了");
            return;
        }
        // 将元素加入
        array[rear]=n;
        // rear重新移动
        rear=(rear+1)%maxSize;
    }
    // 获取队列元素，出队列
    public int getQueue(){
        if (isEmpty()){
            System.out.println("队列为空");
            throw new RuntimeException("队列为空");
        }
        int value=array[front];
        front=(front+1)%maxSize;
        return value;
    }
    // 拿出队列的所有元素
    public void showQueue(){
        if (isEmpty()){
            System.out.println("队列为空，没数据");
            return;
        }
        for (int i = 0; i <this.getAffectiveCount() ; i++) {
            // 环形队列，i的值进行取模运算,算法
            System.out.printf("%d\n",array[i%maxSize]);

        }
    }
    // 求出当前队列的有效数据个数
    public int getAffectiveCount(){
        // 算法
        return (rear+maxSize-front)%maxSize;
    }
    // 显示头元素
    public int headQueue(){
        if (isEmpty()){
            System.out.println("队列为空");
        }
        return array[front];
    }
}
